package org.example.leetCode.simple;

/**
 * 给你一个 32 位的有符号整数 x ，返回将 x 中的数字部分反转后的结果。
 *
 * 如果反转后整数超过 32 位的有符号整数的范围[−231, 231− 1] ，就返回 0。
 *
 * 假设环境不允许存储 64 位整数（有符号或无符号）。
 * 
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/reverse-integer
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Reverse_0007 {

    public static void main(String[] args) {
        Reverse_0007 reverse7 = new Reverse_0007();
        int reverse = reverse7.reverse(Integer.MAX_VALUE);
        System.out.printf(String.valueOf(reverse));
    }

    /**
     * 性能一般，2ms
     * @param x
     * @return
     */
    public int reverse1(int x) {
        String num = String.valueOf(x);
        int length = num.length();
        char arr[] = new char[length];
        if (num.startsWith("-")) {
            arr[0] = '-';
            for (int i = 1; i < length; i++) {
                arr[length - i] = num.charAt(i);
            }
        } else {
            for (int i = 0; i < length; i++) {
                arr[length - 1 - i] = num.charAt(i);
            }
        }
        String strResult = String.valueOf(arr);
        long result = Long.parseLong(String.valueOf(strResult));
        if (Integer.MAX_VALUE < result || Integer.MIN_VALUE > result) {
            return 0;
        }
        return Integer.parseInt(strResult);
    }

    /**
     * 注意负数的绝对值超过范围情况，性能最差，11秒
     * @param x
     * @return
     */
    @Deprecated
    public int reverse2(int x) {
        if (x == Integer.MIN_VALUE || x == Integer.MAX_VALUE) {
            return 0;
        }
        String strResult = "";
        if (x < 0) {
            strResult += "-";
            x = Math.abs(x);
        }
        int bit = x / 10;
        do {
            strResult += x % 10;
            x = bit;
            bit = x / 10;
        } while (x > 0);

        long result = Long.parseLong(strResult);
        if (Integer.MAX_VALUE < result || Integer.MIN_VALUE > result) {
            return 0;
        }
        return Integer.parseInt(strResult);
    }

    /**
     * 性能最优，1ms
     * @param x
     * @return
     */
    public int reverse(int x) {
        long num = 0;
        while (x != 0) {
            num = num * 10 + x % 10;
            x = x / 10;
        }

        return (int) num == num ? (int) num : 0;
    }
}
